package top.shiyiri.threading;

/**
 * 测试 Thread 中的常用方法
 * 1.start()：启动当前线程；调用当前线程的 run()
 * 2.run()：通常需要重写 Thread 类中的此方法，将创建的线程要执行的操作声明到此方法中
 * 3.currentThread()：静态方法，返回执行当前代码的线程
 * 4.getName()：获取当前线程的名字
 * 5.setName()：设置当前线程的名字
 * 6.yield()：释放当前 cpu 的执行权
 * 7.join()：在线程 a 中调用线程 b 的 join()，此时线程 a 就进行阻塞状态，直到线程 b 完全执行完以后，
 *          线程 a 才结束阻塞状态
 * 8.stop()：已过时。当执行此方法时，强制结束当前线程
 * 9.sleep()：让当前线程 “睡眠” 指定 millitime 毫秒。在指定的 millitime 毫秒时间内，
 *          当前线程是阻塞状态
 * 10.isAlive()：判断当前线程是否存活

 * 线程的优先级：
 * 1.
 * MAX_PRIORITY: 10
 * MIN_PRIORITY: 1
 * NORM_PRIORITY: 5
 * 2.如何获取和设置当前线程的优先级：
 *      getPriority()：获取线程的优先级
 *      setPriority(int p)：设置线程的优先级
 *
 *      说明：高优先级的线程要抢占低优先级线程cpu的执行权。但是只是从概率上讲，高优先级
 *      的线程高概率的情况下被执行。并不意味着只有当高优先级的线程执行完以后，低优先级的线程才执行
 *
 * @author Aunean
 * @date 2021/12/25
 */
public class ThreadMethodTest {

    public static void main(String[] args) {

        //MyThread2 t1 = new MyThread2();
        //给线程命名（方式一）
        //t1.setName("线程一");

        //方式二
        MyThread2 t1 = new MyThread2("分线程一");
        t1.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        //给主线程命名
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + Thread.currentThread().getPriority() + ":" + i + "********main()*********");
            }

            if (i == 20) {
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println(t1.isAlive());
    }
}

class MyThread2 extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {

//                try {
//                    sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
                System.out.println(getName() + ":" + getPriority() + ":" + i);
            }
            if (i % 20 == 0) {
                yield();
            }
        }
    }
    public MyThread2(String name) {
        super(name);
    }

    public MyThread2() {
    }
}
